home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 10868 / 10868.xpi / modules / engines / prefs.js < prev    next >
Text File  |  2010-02-02  |  8KB  |  267 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Bookmarks Sync.
  15.  *
  16.  * The Initial Developer of the Original Code is Mozilla.
  17.  * Portions created by the Initial Developer are Copyright (C) 2008
  18.  * the Initial Developer. All Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *  Anant Narayanan <anant@kix.in>
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. const EXPORTED_SYMBOLS = ['PrefsEngine'];
  38.  
  39. const Cc = Components.classes;
  40. const Ci = Components.interfaces;
  41. const Cu = Components.utils;
  42.  
  43. const WEAVE_SYNC_PREFS = "extensions.weave.prefs.sync";
  44. const WEAVE_PREFS_GUID = "preferences";
  45.  
  46. Cu.import("resource://weave/util.js");
  47. Cu.import("resource://weave/engines.js");
  48. Cu.import("resource://weave/stores.js");
  49. Cu.import("resource://weave/trackers.js");
  50. Cu.import("resource://weave/type_records/prefs.js");
  51.  
  52. function PrefsEngine() {
  53.   this._init();
  54. }
  55. PrefsEngine.prototype = {
  56.   __proto__: SyncEngine.prototype,
  57.   name: "prefs",
  58.   _displayName: "Preferences",
  59.   description: "Synchronize your home page, selected persona, and more",
  60.   logName: "Prefs",
  61.   _storeObj: PrefStore,
  62.   _trackerObj: PrefTracker,
  63.   _recordObj: PrefRec,
  64.  
  65.   _wipeClient: function _wipeClient() {
  66.     SyncEngine.prototype._wipeClient.call(this);
  67.     this.justWiped = true;
  68.   },
  69.  
  70.   _reconcile: function _reconcile(item) {
  71.     // Apply the incoming item if we don't care about the local data
  72.     if (this.justWiped) {
  73.       this.justWiped = false;
  74.       return true;
  75.     }
  76.     return SyncEngine.prototype._reconcile.call(this, item);
  77.   }
  78. };
  79.  
  80.  
  81. function PrefStore() {
  82.   this._init();
  83. }
  84. PrefStore.prototype = {
  85.   __proto__: Store.prototype,
  86.   name: "prefs",
  87.   _logName: "PrefStore",
  88.  
  89.   get _prefs() {
  90.     let prefs = Cc["@mozilla.org/preferences-service;1"].
  91.       getService(Ci.nsIPrefBranch);
  92.  
  93.     this.__defineGetter__("_prefs", function() prefs);
  94.     return prefs;
  95.   },
  96.  
  97.   get _syncPrefs() {
  98.     let service = Cc["@mozilla.org/preferences-service;1"].
  99.       getService(Ci.nsIPrefService);
  100.     let syncPrefs = service.getBranch(WEAVE_SYNC_PREFS).getChildList("", {}).
  101.       map(function(elem) { return elem.substr(1); });
  102.  
  103.     this.__defineGetter__("_syncPrefs", function() syncPrefs);
  104.     return syncPrefs;
  105.   },
  106.  
  107.   _getAllPrefs: function PrefStore__getAllPrefs() {
  108.     let values = [];
  109.     let toSync = this._syncPrefs;
  110.  
  111.     let pref;
  112.     for (let i = 0; i < toSync.length; i++) {
  113.       if (!this._prefs.getBoolPref(WEAVE_SYNC_PREFS + "." + toSync[i]))
  114.         continue;
  115.  
  116.       pref = {};
  117.       pref["name"] = toSync[i];
  118.  
  119.       switch (this._prefs.getPrefType(toSync[i])) {
  120.         case Ci.nsIPrefBranch.PREF_INT:
  121.           pref["type"] = "int";
  122.           pref["value"] = this._prefs.getIntPref(toSync[i]);
  123.           break;
  124.         case Ci.nsIPrefBranch.PREF_STRING:
  125.           pref["type"] = "string";
  126.           pref["value"] = this._prefs.getCharPref(toSync[i]);
  127.           break;
  128.         case Ci.nsIPrefBranch.PREF_BOOL:
  129.           pref["type"] = "boolean";
  130.           pref["value"] = this._prefs.getBoolPref(toSync[i]);
  131.           break;
  132.         default:
  133.           this._log.trace("Unsupported pref type for " + toSync[i]);
  134.       }
  135.       if ("value" in pref)
  136.         values[values.length] = pref;
  137.     }
  138.  
  139.     return values;
  140.   },
  141.  
  142.   _setAllPrefs: function PrefStore__setAllPrefs(values) {
  143.     for (let i = 0; i < values.length; i++) {
  144.       switch (values[i]["type"]) {
  145.         case "int":
  146.           this._prefs.setIntPref(values[i]["name"], values[i]["value"]);
  147.           break;
  148.         case "string":
  149.           this._prefs.setCharPref(values[i]["name"], values[i]["value"]);
  150.  
  151.           // Notify the lightweight theme manager of the new value
  152.           if (values[i].name == "lightweightThemes.usedThemes") {
  153.             try {
  154.               let ltm = {};
  155.               Cu.import("resource://gre/modules/LightweightThemeManager.jsm", ltm);
  156.               ltm = ltm.LightweightThemeManager;
  157.               if (ltm.currentTheme) {
  158.                 ltm.currentTheme = null;
  159.                 ltm.currentTheme = ltm.usedThemes[0];
  160.               }
  161.             }
  162.             // LightweightThemeManager only exists in Firefox 3.6+
  163.             catch (ex) {}
  164.           }
  165.  
  166.           break;
  167.         case "boolean":
  168.           this._prefs.setBoolPref(values[i]["name"], values[i]["value"]);
  169.           break;
  170.         default:
  171.           this._log.trace("Unexpected preference type: " + values[i]["type"]);
  172.       }
  173.     }
  174.   },
  175.  
  176.   getAllIDs: function PrefStore_getAllIDs() {
  177.     /* We store all prefs in just one WBO, with just one GUID */
  178.     let allprefs = {};
  179.     allprefs[WEAVE_PREFS_GUID] = this._getAllPrefs();
  180.     return allprefs;
  181.   },
  182.  
  183.   changeItemID: function PrefStore_changeItemID(oldID, newID) {
  184.     this._log.trace("PrefStore GUID is constant!");
  185.   },
  186.  
  187.   itemExists: function FormStore_itemExists(id) {
  188.     return (id === WEAVE_PREFS_GUID);
  189.   },
  190.  
  191.   createRecord: function FormStore_createRecord(guid, cryptoMetaURL) {
  192.     let record = new PrefRec();
  193.     record.id = guid;
  194.  
  195.     if (guid == WEAVE_PREFS_GUID) {
  196.       record.encryption = cryptoMetaURL;
  197.       record.value = this._getAllPrefs();
  198.     } else {
  199.       record.deleted = true;
  200.     }
  201.  
  202.     return record;
  203.   },
  204.  
  205.   create: function PrefStore_create(record) {
  206.     this._log.trace("Ignoring create request");
  207.   },
  208.  
  209.   remove: function PrefStore_remove(record) {
  210.     this._log.trace("Ignoring remove request")
  211.   },
  212.  
  213.   update: function PrefStore_update(record) {
  214.     this._log.trace("Received pref updates, applying...");
  215.     this._setAllPrefs(record.value);
  216.   },
  217.  
  218.   wipe: function PrefStore_wipe() {
  219.     this._log.trace("Ignoring wipe request");
  220.   }
  221. };
  222.  
  223. function PrefTracker() {
  224.   this._init();
  225. }
  226. PrefTracker.prototype = {
  227.   __proto__: Tracker.prototype,
  228.   name: "prefs",
  229.   _logName: "PrefTracker",
  230.   file: "prefs",
  231.  
  232.   get _prefs() {
  233.     let prefs = Cc["@mozilla.org/preferences-service;1"].
  234.       getService(Ci.nsIPrefBranch2);
  235.  
  236.     this.__defineGetter__("_prefs", function() prefs);
  237.     return prefs;
  238.   },
  239.  
  240.   get _syncPrefs() {
  241.     let service = Cc["@mozilla.org/preferences-service;1"].
  242.       getService(Ci.nsIPrefService);
  243.     let syncPrefs = service.getBranch(WEAVE_SYNC_PREFS).getChildList("", {}).
  244.       map(function(elem) { return elem.substr(1); });
  245.  
  246.     this.__defineGetter__("_syncPrefs", function() syncPrefs);
  247.     return syncPrefs;
  248.   },
  249.  
  250.   _init: function PrefTracker__init() {
  251.     this.__proto__.__proto__._init.call(this);
  252.     this._prefs.addObserver("", this, false);
  253.   },
  254.  
  255.   /* 25 points per pref change */
  256.   observe: function(aSubject, aTopic, aData) {
  257.     if (aTopic != "nsPref:changed")
  258.       return;
  259.  
  260.     if (this._syncPrefs.indexOf(aData) != -1) {
  261.       this.score += 1;
  262.       this.addChangedID(WEAVE_PREFS_GUID);
  263.       this._log.trace("Preference " + aData + " changed");
  264.     }
  265.   }
  266. };
  267.